package modules

import "fmt"

var implApps = map[string]ImplService{}

// 模块的业务实例的接口
type ImplService interface {
	ImplConfig()
	ImplName() string
}

// 服务的实例注册到svcs map当中
func RegistryImpls(svc ImplService) {
	// 根据对象满足的接口来注册具体的服务
	// switch svc.(type) {
	// case host.Service:
	// default:
	// }

	// 先判断服务是否存在
	if _, ok := implApps[svc.ImplName()]; ok {
		panic(fmt.Sprintf("service %s has registried", svc.ImplName()))
	}

	implApps[svc.ImplName()] = svc
}

// 用于初始化所有注册到IOC容器里面的服务
func InitImpls() {
	// 通过遍历所有服务，调他们的配置完成初始化
	for _, v := range implApps {
		v.ImplConfig()
	}
}

// http 实例去获取 impl 实例
func GetImpl(name string) interface{} {
	for k, v := range implApps {
		if k == name {
			return v
		}
	}

	return nil
}

// 查询已经加载完成的impl App有哪些
func LoadImplApps() (names []string) {
	for k := range implApps {
		names = append(names, k)
	}

	return names
}
